package com.tedu.api.list;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

/**
 * 数组：遍历数据   遍历数据三种：普通for、增强for、Arrays工具类
 * 集合：遍历数据    遍历数据三种：普通for、增强for、Iterator工具类
 * 保存数据优选：集合---遍历数据优选Iterator迭代器
 * Iterator迭代器------接口----依赖Collection提供方法：iterator()
 *
 *  集合：迭代器的使用方式：问、取、删
 */
public class Collection_IteratorAPI {
    @Test
    public void testIteratorAPI(){
        Collection c1=new ArrayList();
        c1.add("one");c1.add("tow");c1.add("three");
        /**
         * iterator()方法：获取集合的迭代器---遍历数据
         */
     Iterator it=c1.iterator();
     //迭代器使用：1.问---集合中是否存在元素
        /**
         * hasNext()  返回值：boolean
         * 作用：判断集合是否还有元素可以遍历
         *      返回true有反之false
         */
        while(it.hasNext()){//迭代器：问操作---hastNext（）
               //2.取----如果集合中存在元素：取出元素---next（）
            /**
             * E  next（）   返回值：E泛型    简单理解：object
             * 作用：遍历元素
             *
             */
            String str=(String) it.next();
            System.out.println("集合迭代器："+str);

        }
    }
    /**
     * 集合三种遍历方式：Iterator迭代器【问、取操作】
     *                普通for【难度、需要查API】
     *                增强for【没有难度】
     *                开发：选一种使用
     *                遍历同时对集合做元素操作---Iterator迭代器
     *
     */
    @Test
    public void testFor() {
        Collection collection = new ArrayList();
        //需求：10个元素普通for增加元素：0~9数值
        for (int i = 0; i < 10; i++) {
            collection.add(i);


        }
        System.out.println("打印集合数据：" + collection);


        //获取集合中的所有数据-----操作：遍历
        //①使用普通for遍历collection集合，提醒：查API
        for(int i=0;i<collection.size();i++){
            //i值：拿下标
            System.out.println("普通for输出集合："+((List)collection).get(i));
        }

        //获取到数组元素：int[] arr={1,2,3};   数组名【小标】  arr[1]
        //获取元素：List---方法get(下标)                集合名【小标】 x
        //②使用增强for遍历：   语法：for(Integer i:集合名){}
        //                        for(Object i:collection){}
        //collection是顶级集合--存任何数据---Object类型
          for (Object i:collection){
              System.out.println(i);
          }
    }
    /**
     * 遍历同时对集合元素删除操作---Iterator迭代器
     * Iterator迭代器---删除操作【真删元素】
     * remove（）     返回值：void
     * 作用：删除迭代器获取的元素【理解：next（）取元素之后，删除】
     * Iterator迭代器使用规则：问、取、删
     * 作业：增强for循环，删除testRemove单元测试中集合包含“元旦”元素
     *      作业单元测试名：  testHomeWork（）
     */
    @Test
    public void testHomeWork(){
        Collection<String> c=new ArrayList<>();
        c.add("十一");c.add("元旦");c.add("春节");c.add("元宵节");
        for (String str:c){
            if ("元旦".equals(str)){ //元旦 判断 集合“元旦”
                c.remove("元旦");   //是集合中元旦，删除
            }
            System.out.println("增强for"+str);
        }
        System.out.println("打印集合："+c);
    }
    @Test
    public void testRemove(){
        Collection c=new ArrayList();
        c.add("十一");c.add("元旦");c.add("春节");c.add("元宵节");
    //创建集合collection---遍历同时删除春节的元素
        System.out.println("Collection集合："+c);
        //1.依赖集合Collection--提供iterator（）方法：创建迭代器对象
       Iterator it=c.iterator();
       //2.使用迭代器：问、取、删
        while(it.hasNext()){//:集合中是否还有元素
       //3.获取集合中元素；next（）  获取集合中元素，默认类型Object
       String str=(String) it.next();
       //4.删除集合中存在“春节”元素
       //4.1如果集合中元素名“春节”---删除
       if ("春节".equals(str)){
           it.remove();//next()拿到元素之后删除操作
       }

           // c.remove("春节");   //集合中删除


        }    }
    /**
     * 泛型：与集合搭配使用    E element 元素  理解：Object
     * JDK1.5之后推出新特性，集合存在任何数据，获取数据非常混乱
     *       对象、整整 、 小数型、  取   Object  知道类型
     *泛型主要功能是约束集合的类型！
     * 泛型编译器认可的，JVM虚拟机不认可，认为：Object对象
     * 使用泛型好处：1.约束类型，数据稳定【统一类型】,获取元素无需造型
     *             2.类型：对象---继承以及继承之后方法使用
     * 语法：
     * Collection<类型：引用类型、基本类型、包装类型> c=new ArrayList();
     * new ArrayList<类型：引用类型、基本类型、包装类型>（）
     */
    @Test
    public void testElement(){
        Collection<String> c=new ArrayList<String>();
        System.out.println(c);
        //JDK1.7泛型写法     建议使用
        Collection<String> c2=new ArrayList<>();
        c2.add("老六");c2.add("老七");c2.add("老八");
        Iterator<String> it=c2.iterator();
        //c2.add("1");c2.add("1.23");
        //c2.add(new Object);
        while(it.hasNext()){//问：存在数据，存在true
            String str=it.next();
            }

        Collection<Integer> c3=new ArrayList<>();
       // Collection<boolean> c4=new ArrayList<boolean>();
        //泛型定义：？代表：不限制类型    项目非常大---功能
        Collection<?> c4=new ArrayList<>();
//        c4.add("字符串");c4.add(1);c4.add(1.23);
//        c4.add(new Object());
        c4.add(null);    //只能存没有意义的值：引用类型---默认值：null
    }

    /**
     * 泛型中通配符   ？【任意类型】   的使用
     * ？【任意类型】  extends   父类
     * 【任意类型：父类的所有子类】     ---约束----
     */
    @Test
    public void testE(){
        //测试:创建集合---传入参数：引用类型：Apple对象
        Collection<Apple>apples=new ArrayList<>();
        apples.add(new Apple());    //存入apple对象
        TestJob.printFruit(apples);  //上界限定操作：针对集合
        Collection<Orange> oranges=new ArrayList<>();
        oranges.add(new Orange());
        TestJob.printFruit(oranges);  //上界限定操作：针对集合
//        Collection<Pear> pears=new ArrayList<>();
//        pears.add(new Pear());
//       TestJob.printFruit(pears);  //？：上界限定操作：针对集合
        }
}
//  集合重点：Collection常用方法，Iterator迭代器，泛型【超级重点】
//聊天室    javaSE    WEB    数据库：----JavaWEB【集合】
